import { logout } from '@/api/user'
import router from '@/router'
import store from '@/store'
import user from '@/store/modules/user'
// import { config } from '@vue/test-utils'
import axios from 'axios'
import { Message } from 'element-ui'
import { getTimeStamp } from './auth'
const timeout = 7200
// 这里是创建一个axios实例：原来的axios并没有受到影响
const service = axios.create({
  // 创建axios实例的时候，可以配置一下baseURL(封装一下)
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})
// **use 拦截器可以接收两个回调函数作为参数；一个是：状态码为200的，一个是状态码非200的情况
// 请求拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    // 这里是注入token：
    // 是否有token；
    // 还要判断token是否已经失效
    // 逻辑是：拿出当前的时间戳；和之前存在cookies里的时间戳两相对比：
    // 失效就强制退出：
    // 如果带了token：就把token放在请求头上：
    if (isCheckTimeout()) {
      console.log('登出')
      // store.dispatch('/user/loginout') // 第一个user没有斜杠！！
      store.dispatch('user/logout')
      // 跳转到登录页：
      router.push('/login')
      // 弹出设置提醒
      return Promise.reject(new Error('token 超时，请重新登录'))
    } else {
      config.headers.Authorization = `Bearer ${store.getters.token}`
      // config.headers['Authorization'] = `Bearer ${store.getters.token}`
    }
  }
  return config
})
// 响应拦截器
service.interceptors.response.use(res => {
  // res里面都是状态码为200的时候
//   console.log(res.data)
  const { data, message, success } = res.data
  if (success) {
    //   如果操作成功的话：
    return data
  } else {
    //   不成功的话：就弹窗：错误信息：
    Message.error(message)
    // new Promise(new Error(message))
    return Promise.reject(new Error(message))
  }
}, err => {
//   console.dir(err)   //dir 可以把具体的代码情况给展开；从而可以看到里面的具体内容！！
  // 如果token失效：不光要弹窗提醒；还应该删除数据等
  if (err.response && err.response.data && err.response.data.code === 10002) {
    store.dispatch('user/logout')
    router.push('/login')
  }
  Message.error(err.message)
  //   一定要return！！不然计算token是undefined！！它也会跑到首页去！！
  return Promise.reject(new Error(err.message))
})
export default service
// 判断时间戳是否失效：
function isCheckTimeout(params) {
  const now = Date.now()
  const savedTime = getTimeStamp()
  return (now - savedTime) / 1000 >= timeout
}
